package cn.demoncat.util.lang;

import cn.demoncat.util.sec.BCryptUtil;
import cn.demoncat.util.sec.Md5Util;

/**
 * 
 * 用户密码工具类
 *
 * @author yxl
 *
 * @version 2.0
 *
 * @since 2016-9-19
 */
public final class PwdUtil {
 
    
	/**
	 * 生成随机盐
	 * 
	 * @return UUID数字 = 20
	 *
	 * @author 延晓磊
	 */
	public static String genSalt(){
		return IDUtil.getNumUuid();
	}
 
	/**
	 * 根据随机盐和MD5密码，生成加密密码
	 * 
	 * @param salt
	 * @param md5Pwd
	 * @return MD5(md5Pwd + salt) == 32
	 *
	 * @author 延晓磊
	 */
	public static String genMd5Pwd(String salt, String md5Pwd){
		return Md5Util.digest(salt.substring(0,8) + md5Pwd + salt.substring(8));
	}

	/**
	 * 根据随机盐和明文密码，生成加密密码
	 *
	 * @param salt
	 * @param pwd
	 * @return MD5(MD5(pwd) + salt) == 32
	 *
	 * @author 延晓磊
	 */
	public static String genPwd(String salt, String pwd){
		return genMd5Pwd(salt, Md5Util.digest(pwd));
	}

	/**
	 * 根据随机盐和MD5密码，检查密码
	 *
	 * @param salt
	 * @param md5Pwd
	 * @param secret 	MD5(md5Pwd + salt)
	 * @return
	 *
	 * @author 延晓磊
	 */
	public static boolean checkMd5Pwd(String salt, String md5Pwd, String secret){
		return secret.equals(genMd5Pwd(salt, md5Pwd));
	}

	/**
	 * 根据随机盐和明文密码，检查密码
	 *
	 * @param salt
	 * @param pwd
	 * @param secret	MD5(MD5(pwd) + salt)
	 * @return
	 *
	 * @author 延晓磊
	 */
	public static boolean checkPwd(String salt, String pwd, String secret){
		return secret.equals(genPwd(salt, pwd));
	}


	/**
	 * 根据MD5密码，生成加密密码
	 *
	 * @param md5Pwd
	 *
	 * @return BCrypt(md5Pwd) == 100
	 *
	 * @author 延晓磊
	 */
	public static String genMd5Pwd(String md5Pwd){
		return BCryptUtil.hash(md5Pwd);
	}

	/**
	 * 根据明文密码，生成加密密码
	 *
	 * @param pwd
	 * @return BCrypt(MD5(pwd)) == 100
	 *
	 * @author 延晓磊
	 * @since 2022年09月08日
	 */
	public static String genPwd(String pwd){
		return genMd5Pwd(Md5Util.digest(pwd));
	}

	/**
	 * 根据MD5密码，检查密码
	 *
	 * @param md5Pwd
	 * @param secret BCrypt(md5Pwd)
	 * @return
	 *
	 * @author 延晓磊
	 * @since 2022年09月08日
	 */
	public static boolean checkMd5Pwd(String md5Pwd, String secret){
		return BCryptUtil.check(md5Pwd, secret);
	}

	/**
	 * 根据明文密码，检查密码
	 *
	 * @param pwd
	 * @param secret BCrypt(MD5(pwd))
	 * @return
	 *
	 * @author 延晓磊
	 * @since 2022年09月08日
	 */
	public static boolean check(String pwd, String secret){
		return checkMd5Pwd(Md5Util.digest(pwd), secret);
	}
}
